MySQL 3306 端口不通的分层排查

复核日期:2026-10-16。不要一开始就把 bind-address 改成 0.0.0.0;先确认业务来源网段,再按最小暴露原则放行。

1. 先区分错误类型

  • Connection refused:目标主机可达,但端口未监听、被本机策略拒绝或服务未启动。
  • Connection timed out:路由、云安全组、防火墙或 ACL 可能丢弃了流量。
  • Access denied:网络已经通,问题在用户、来源地址、密码或权限。
  • TLS/握手报错:检查客户端版本、证书和 MySQL 的加密要求。

2. 服务端检查

systemctl status mysqld --no-pager
ss -lntp | grep ':3306'
mysql -NBe "SHOW VARIABLES LIKE 'port'; SHOW VARIABLES LIKE 'bind_address';"

如果只监听 127.0.0.1:3306,远程客户端无法连接。根据实际需求绑定服务器内网地址,或使用 MySQL 支持的适当监听配置。配置文件常见位置为 /etc/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf,以当前发行版为准。

[mysqld]
bind-address = 10.1.105.12

修改前先备份配置并验证语法,重启后再次用 ss 检查。官方变量说明:MySQL bind_address

3. 网络路径检查

从客户端执行:

ping 10.1.105.12
nc -vz -w 3 10.1.105.12 3306
traceroute 10.1.105.12

Ping 成功不代表 TCP 3306 一定可达。逐层核对主机防火墙、云安全组、VPC/NAT、机房 ACL 和负载均衡健康状态,只允许业务服务器网段访问,禁止把数据库端口直接暴露到公网。

4. 用户与授权检查

SELECT user, host, account_locked FROM mysql.user ORDER BY user, host;
SHOW GRANTS FOR 'appuser'@'10.1.105.%';

MySQL 账号由“用户名 + 来源 Host”共同确定。不要为了省事创建来源为 % 且权限过大的账号;应用账号应限制来源、库表权限并使用独立强密码。

5. 抓取关键日志

journalctl -u mysqld --since '-30 min' --no-pager
tail -n 200 /var/log/mysqld.log

日志路径随发行版和配置而异。若使用容器,还要检查端口映射、容器网络和服务发现。

验证清单

  1. 客户端到目标 IP 的 3306 TCP 连通。
  2. 服务只监听需要的地址,不暴露到无关网络。
  3. 指定账号能连接且仅拥有所需权限。
  4. 应用连接池恢复,服务端没有持续认证失败或 TLS 告警。
  5. 记录变更内容、执行人、验证结果和回滚方式。
Copyright © yan-jian.com 2023 - 2026 · Powered by GitBook更新时间: 2026-10-17 08:48:44

results matching ""

    No results matching ""